/*
 * Copyright (C) 2017 meituan All rights reserved.
 */
package springboot.tools.utils;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数字计算工具类
 */
public class NumericUtil {

    private static final String FLOAT_REGEX = "^(-?\\d+)(\\.\\d+)?$";

    /**
     * 百分比转换为小数点形式
     *
     * @param percentNumeric
     * @return
     */
    public static BigDecimal percentToDecimal(String percentNumeric) {
        if (StringUtils.isBlank(percentNumeric)) {
            return null;
        }
        String percent = percentNumeric.replace("%", "");
        Float f = Float.valueOf(percent) / 100;
        BigDecimal decimal = new BigDecimal(f).setScale(4, BigDecimal.ROUND_HALF_UP);
        return decimal;
    }

    /**
     * 小数点形式转换为百分比
     *
     * @param decimal
     * @return
     */
    public static String decimalToPercent(BigDecimal decimal) {
        DecimalFormat df = new DecimalFormat("0.00%");
        if (BigDecimal.ZERO.compareTo(decimal) == 0) {
            return "0.00%";
        }
//      BigDecimal d=new BigDecimal(decimal);
        String percent = df.format(decimal);
        return percent;
    }

    /**
     * 校验字符串是否是浮点数
     *
     * @param target
     * @return
     */
    public static boolean checkStrIsFloat(String target) {
        Pattern FLOAT_PATTERN = Pattern.compile(FLOAT_REGEX);
        return FLOAT_PATTERN.matcher(target).matches();
    }

    /**
     * 校验字符串是否是数字（两位小数、包含正负）
     */
    public static boolean isNumber(String str) {
        Pattern pattern = Pattern.compile("^([\\+\\-]?(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?)$"); // 判断小数点后2位的数字的正则表达式
        Matcher match = pattern.matcher(str);
        if (match.matches() == false) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * @description: 只支持正数
     * @date: 2020/4/24
     */
    public static boolean isNumberPos(String str) {
        Pattern pattern = Pattern.compile("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?$"); // 判断小数点后2位的数字的正则表达式
        Matcher match = pattern.matcher(str);
        if (match.matches() == false) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * 校验字符串是否为YYYY-MM
     */
    public static boolean isYearmo(String str) {
        Pattern pattern = Pattern.compile("((19|20)[0-9]{2})-(0?[1-9]|1[012])");
        Matcher match = pattern.matcher(str);
        if (match.matches() == false) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * double数据科学计数法转正常
     * @param d
     * @return
     */
    public static BigDecimal formatDouble(double d) {
        NumberFormat nf = NumberFormat.getInstance();
        //设置保留多少位小数
        nf.setMaximumFractionDigits(2);
        // 取消科学计数法
        nf.setGroupingUsed(false);
        //返回结果
        return new BigDecimal(nf.format(d));
    }

}
